#include "modbusservice.h"



int MOD_MESSAGE_TAB[4];

ModBusService::ModBusService(QObject* par) : QThread(par)
{

}
ModBusService::~ModBusService()
{

    qDebug("exit free ctx and mb_mapping\n");
    modbus_mapping_free(mb_mapping);
    delete [] query;
    /* For RTU */
     modbus_close(ctx);
     modbus_free(ctx);
}

void ModBusService::stopImmediately()
{
    m_isCanRun = false;
}
void ModBusService::startImmediately()
{
    m_isCanRun = true;
}

void  ModBusService::Iinit_Data()
{

//初始化数据
modbus_set_bits_from_bytes(mb_mapping->tab_input_bits, 0, UT_INPUT_BITS_NB,UT_INPUT_BITS_TAB);
modbus_set_bits_from_bytes(mb_mapping->tab_bits, UT_BITS_NB, 64,UT_BITS_TAB);
/* Initialize values of INPUT REGISTERS */
    unsigned int i=0;
    for (i=0; i < UT_INPUT_REGISTERS_NB; i++) {
        mb_mapping->tab_input_registers[i] = UT_INPUT_REGISTERS_TAB[i];
    }

    for (int i=0; i < UT_REGISTERS_NB; i++) {
        mb_mapping->tab_registers[i] = UT_REGISTERS_TAB[i];
    }
}

int ModBusService::Service_Init()
{
    //ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);
    //ctx = modbus_new_rtu("/dev/ttyS0", 115200, 'N', 8, 1);
    ctx = modbus_new_rtu("/dev/ttySAC1", 115200, 'N', 8, 1);
    modbus_set_slave(ctx, 1);
    modbus_connect(ctx);
    mb_mapping = modbus_mapping_new(UT_BITS_NB, UT_INPUT_BITS_NB,UT_REGISTERS_NB, UT_INPUT_REGISTERS_NB);
    if (mb_mapping == NULL)
        modbus_free(ctx);
    query = new uint8_t [MODBUS_RTU_MAX_ADU_LENGTH];

    qDebug()<<"modbus Initialize successfully";

        //开始的时候，先查询数据库中的内容，并初始化服务器中的数值为数据库中的值。
        Iinit_Data();

}


//接收数据，回复数据，根据数据值执行相应事务
void ModBusService::DoSomething()
{
int i;
    do {
                rc = modbus_receive(ctx, query);//接收请求数据，如果80ms后没有数据，则下一次循环
                /* Filtered queries return 0 */
            } while (rc == 0);
 //qDebug()<<"监控中====";
            /* The connection is not closed on errors which require on reply such as
               bad CRC in RTU. */
            if (rc == -1 && errno != EMBBADCRC) {
                /* Quit */
               // break;
            }
            //UT_REGISTERS_TAB[0]存放命令，UT_REGISTERS_TAB[1]和[2]存放开度，格式为该值除100；
            rc = modbus_reply(ctx, query, rc, mb_mapping);
            for(i=0;i<UT_REGISTERS_NB;i++)
            {
                UT_REGISTERS_TAB[i]=mb_mapping->tab_registers[i];
                MOD_MESSAGE_TAB[i] = mb_mapping->tab_registers[i];
            }
            if( UT_REGISTERS_TAB[0]==G_OPEN)
            {
                //打开闸门
               MOD_MESSAGE_TAB[0] = 1;
               qDebug()<<"Gate Open="<<UT_REGISTERS_TAB[0];

            }
            else if( UT_REGISTERS_TAB[0]==G_CLOSE)
            {
                //关闭闸门
                MOD_MESSAGE_TAB[0] = 2;
                qDebug()<<"Gate Close="<<UT_REGISTERS_TAB[0];
            }
            else if( UT_REGISTERS_TAB[0]==G_PRESET)
            {
                //预置闸门
                MOD_MESSAGE_TAB[0] = 3;
                qDebug()<<"Gate_Preset="<<UT_REGISTERS_TAB[0];
            }

            mb_mapping->tab_registers[0] = 0; //重置第一位数
            // emit progress();
}

//线程执行任务
void ModBusService::run()
{
    m_isCanRun=false;
    Service_Init();
    while(1)
    {
        DoSomething();
        if(m_isCanRun)//在每次循环判断是否可以运行，如果不行就退出循环
                    {
                       break;
                    }
    }

}
